Aidemy 機械学習概論
scikit-learn
code: Python
from sklearn import datasets
from sklearn.model_selection import train_test_split
# 「IRIS」というデータセットを読み込む
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 「X_train, X_test, y_train, y_test」にデータを格納する
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# トレーニングデータとテストデータのサイズを確認する
print ("X_train :", X_train.shape)
print ("y_train :", y_train.shape)
print ("X_test :", X_test.shape)
print ("y_test :", y_test.shape)
--------------------------------------------------------------------------
X_train : (120, 4)
y_train : (120,)
X_test : (30, 4)
y_test : (30,)
--------------------------------------------------------------------------
k-分割交差検証の理論
k-分割交差検証(クロスバリデーション) では、用意したトレーニングデータセットをk分割し、 そのうちの1つをテストデータ、残りのk-1個を学習データとして使用する。そして、 学習と評価を繰り返して得られるk個のモデルと性能評価から平均性能を算出 するという手法。
データを最大限に利用して検証できることがk-分割交差検証の強みですが、k回の検証を行うので多くの時間が必要になるという一面もある。しかし、k-分割交差検証によって作られたk個のモデルから、より正確で安定したモデルを選ぶことが可能となる。
k-分割交差検証には、 一個抜き交差検証(Leave-One-Out:LOOクロスバリデーション) という手法もある。LOOでは、kにデータ数と同じ値を設定して、データを1つずつ分割し、そのうちの1データのみをテストデータとして扱う。
例えば、データセットに20個のデータがある場合に20分割し、19個で学習を行い、残りの1個でテストを行う。そして、20回の学習で得られた性能評価の平均値から精度を算出する。 50~100データ程度のデータセットを扱う場合には、この手法が適している。
k-分割交差検証の実践
code: Python
from sklearn import svm, datasets, cross_validation
# 「IRIS」というデータセットを読み込む
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 機械学習アルゴリズムSVMを使用
svc = svm.SVC(C=1, kernel="rbf", gamma=0.001)
# 交差検証法を用いてスコアを求める
# 内部では、X、yがそれぞれ「X_train, X_test, y_train, y_test」の様に分割され処理されます。
scores = cross_validation.cross_val_score(svc, X, y, cv=5)
# トレーニングデータとテストデータのサイズを確認する
print(scores)
print("平均スコア :", scores.mean())
--------------------------------------------------------------------------
平均スコア : 0.913333333333
--------------------------------------------------------------------------
混合行列でモデルの性能を評価する指標
混同行列とは、各テストデータに対するモデルの予測結果を、真陽性(True Positive)、真陰性(True Negative)、偽陽性(False Positive)、偽陰性(False Negative)の4つの観点で分類 をし、それぞれに当てはまる予測結果の個数をまとめた表のこと。
「真か偽」は予測が的中したかどうか 、 「陽性か陰性」は予測されたクラス をそれぞれ示している。つまり、
真陽性は陽性クラスと予測され結果も陽性クラスであった個数
真陰性は陰性クラスと予測され結果も陰性クラスであった個数
偽陽性は陽性クラスと予測されたが結果は陰性クラスであった個数
偽陰性は陰性クラスと予測されたが結果は陽性クラスであった個数
をそれぞれ示す。
真陽性(True Positive)と真陰性(True Negative)は機械学習モデルが正解し、偽陰性(False Negative)と偽陽性(False Positive)は機械学習モデルが不正解になったということを示している。
混同行列を実装する
code: Python
import numpy
from sklearn.metrics import confusion_matrix
# y_trueには、正解データの実際のクラスが配列で格納され、y_predには、予想されたクラスが配列で格納する
# データを格納します。今回は0が陽性、1が陰性を示す
# 以下の行に変数confmatにy_trueとy_predの混合行列を格納する
confmat = confusion_matrix(y_true, y_pred)
print(confmat)
--------------------------------------------------------------------------
--------------------------------------------------------------------------
正解率
実際に分類モデルを構築できたならば、その分類モデルは他の分類モデルより性能が優れているのか、優れていないのかを評価するための明確な基準といったものが必要になってくる。
正解率とは、全ての事象の中で、診断結果が合っていた(TP/TNに分類された)数の割合 で、以下のように計算できる。
正解率 = TP + TN / FP + FN + TP + TN
F値
機械学習では適合率/精度(precision)、再現率(recall)、F値という指標で性能評価 されるケースが多い。
適合率/精度(precision)とは陽性と予測されたデータのうち、実際に陽性であるものの割合 であり、 再現率(recall)は、実際の陽性のデータのうち、陽性と予測できたものの割合 を表している。
さらにF値とは 適合率と再現率の両方を組み合わせた(調和平均) のこと。
適合率/精度(precision)、再現率(recall)、F値ともに、 0~1の範囲の中で示され、値が1に近いほうが「性能が良い」 ということを示している。
性能評価指標を実装する
code: Python
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score, f1_score
# データを格納します。今回は0が陰性、1が陽性を示す
# 適合率と再現率をあらかじめ計算する
precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
f1_score = 2 * ((precision * recall) / (precision + recall))
print("F1: %.3f" % f1_score)
--------------------------------------------------------------------------
F1: 0.800
--------------------------------------------------------------------------
再現率と適合率の関係
適合率 陽性であると予測した内の何%が当たっていたか。
再現率 本当に陽性であるケースの内、何%を陽性と判定できたか。
この 二つの性能評価指標の関係は、トレードオフの関係になる。トレードオフの関係というのは、再現率を高くしようとすると適合率が低くなり、適合率を高くしようとすると再現率が低くなることを意味する。